[第2回]Kubernetesの公式チュートリアルをやって基本を押さえる -アプリ公開-
コンニチハ、千葉です。
Kubernetesを勉強中です。Kubernetesは簡単に使えて、かつコンテナのデプロイや可用性を向上することができます。高度なことを簡単に使えるようにテクノロジーが注ぎ込まれています。 チュートリアルでは、クラスタの起動からアプリケーションのデプロイ、確認、公開、アップデートまで基本的なライフサイクルを身につけられます。分量が多いので数回に分けて、チュートリアルをやっていきましょう。
範囲
*の箇所が第2回の範囲です。
- クラスターの作成
- アプリケーションのデプロイ
- アプリケーションの確認
- *アプリケーションの公開
- アプリケーションのスケールアウト
- アプリケーションのアップデート
他の回はこちら
アプリケーションの公開
この章では、以下がわかります。
- Kubernetesのserviceについて
- labelsとLabelSelectorがどのようなものか、またサービスとの関係について
- サービスを使ったアプリケーションの外部公開
チュートリアルではkubectl expose
コマンドを使って、Kubernetesクラスターの外にどうやってアプリケーションを公開するかを学びます。また、kubectl label
コマンドを使ってラベルを確認したり反映します。
新しいServiceの作成
前回起動したpodとminikubeがデフォルトで起動しているserviceを確認します。
$ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-5c69669756-gp797 1/1 Running 2 2d $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
新しいserviceを作成します。expose
コマンドで、ポート番号を指定することで外側と通信ができるようになります。以下のコマンドでは第1回で作成したkubernetes-bootcampというdeploymentsに対してserviceを作成しています。(minikubeはLoadBalancerオプションをまだサポートしていません)
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080 deployment "kubernetes-bootcamp" created $ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080 service "kubernetes-bootcamp" exposed $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d kubernetes-bootcamp NodePort 10.100.255.141 <none> 8080:31674/TCP 11s
serviceが作られたので、インターナルからのアクセスのみだったpodへ、クラスターIP経由でアクセスできるようになりました。イメージ的には、EC2にEIPを付与した感じでしょうか。 どのようなポートがオープンされているか確認します。
$ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: run=kubernetes-bootcamp Annotations: <none> Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.100.255.141 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 31674/TCP Endpoints: 172.17.0.3:8080 Session Affinity: None External Traffic Policy: Cluster Events: <none>
ノードポートを取得して、起動されたコンテナにアクセスしてみます。
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') $ echo NODE_PORT=$NODE_PORT NODE_PORT=31674 $ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-64czk | v=1
アクセスできました。
labelを使う
deploymentを作成すると、podに自動的にlabelが作成されます。labelはkey/valueのペア文字列で、AWSでいうタグのようなものになります。 podeに付与されたlabelを確認します。
$ kubectl describe deployment Name: kubernetes-bootcamp Namespace: default CreationTimestamp: Wed, 09 May 2018 08:11:28 +0900 Labels: run=kubernetes-bootcamp Annotations: deployment.kubernetes.io/revision=1 Selector: run=kubernetes-bootcamp Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge Pod Template: Labels: run=kubernetes-bootcamp Containers: kubernetes-bootcamp: Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Port: 8080/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: kubernetes-bootcamp-5c69669756 (1/1 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 21m deployment-controller Scaled up replica set kubernetes-bootcamp-5c69669756 to 1
labelを指定することで、pod一覧やservice一覧を取得するときにフィルタリングできます。
$ kubectl get pods -l run=kubernetes-bootcamp NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-5c69669756-64czk 1/1 Running 0 23m $ kubectl get services -l run=kubernetes-bootcamp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-bootcamp NodePort 10.100.255.141 <none> 8080:31674/TCP 22m
pod名を取得し環境変数にセットします。
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') $ echo Name of the Pod: $POD_NAME Name of the Pod: kubernetes-bootcamp-5c69669756-64czk
labelコマンドを使って、新しいlabel名を設定します。
$ kubectl label pod $POD_NAME app=v1 pod "kubernetes-bootcamp-5c69669756-64czk" labeled $ kubectl describe pods $POD_NAME Name: kubernetes-bootcamp-5c69669756-64czk Namespace: default Node: minikube/10.0.2.15 Start Time: Wed, 09 May 2018 08:11:28 +0900 Labels: app=v1 pod-template-hash=1725225312 run=kubernetes-bootcamp Annotations: <none> Status: Running IP: 172.17.0.3 Controlled By: ReplicaSet/kubernetes-bootcamp-5c69669756 Containers: kubernetes-bootcamp: Container ID: docker://9cc7ac40161cd91b3682ea418b423777c9cdc3941035570fc48d59f97c1bdad6 Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Image ID: docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af Port: 8080/TCP State: Running Started: Wed, 09 May 2018 08:11:29 +0900 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-bbmpz (ro) Conditions: Type Status Initialized True Ready True PodScheduled True Volumes: default-token-bbmpz: Type: Secret (a volume populated by a Secret) SecretName: default-token-bbmpz Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 29m default-scheduler Successfully assigned kubernetes-bootcamp-5c69669756-64czk to minikube Normal SuccessfulMountVolume 29m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-bbmpz" Normal Pulled 29m kubelet, minikube Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine Normal Created 29m kubelet, minikube Created container Normal Started 29m kubelet, minikube Started container
app=v1というlabelが設定できました。新しいlabelを指定してpodをフィルタしてみます。
$ kubectl get pods -l app=v1 NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-5c69669756-64czk 1/1 Running 0 29m
serviceの削除
delete service
コマンドでserviceを削除します。
$ kubectl delete service -l run=kubernetes-bootcamp service "kubernetes-bootcamp" deleted $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
serviceが削除されたので、外部からアクセスができなくなりました。
curl $(minikube ip):$NODE_PORT
serviceを削除しても、インターナルからのアクセスは可能です。
$ kubectl exec -ti $POD_NAME curl localhost:8080 Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-64czk | v=1
最後に
Serviceを使ったアプリケーションを外部から接続から、labelの設定を行いました。次回はアプリケーションのスケールアウトを行っていきたいと思います。
他の回はこちら